package _022_03_31

import (
	"strconv"
	"strings"
)

/*
自除数 是指可以被它包含的每一位数整除的数。

例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
自除数 不允许包含 0 。

给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。

示例 1：
输入：left = 1, right = 22
输出：[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

示例 2:
输入：left = 47, right = 85
输出：[48,55,66,77]

提示：
1 <= left <= right <= 104

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/self-dividing-numbers
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/self-dividing-numbers
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

func selfDividingNumbers1(left int, right int) []int {

	var (
		tmpByte byte
		tmpMap  map[byte]struct{}
		strTmp  string
		ok, yes bool
		res     = []int{}
	)

	for i := left; i <= right; i++ {
		if i >= 1 && i <= 9 {
			res = append(res, i)
			continue
		}

		strTmp = strconv.Itoa(i)
		if strings.Contains(strTmp, "0") {
			continue
		}

		yes = true
		tmpMap = make(map[byte]struct{}, 9)
		for _, tmpByte = range []byte(strTmp) {
			_, ok = tmpMap[tmpByte]
			if ok {
				continue
			}
			if i%int(tmpByte-48) != 0 {
				yes = false
				break
			}
			tmpMap[tmpByte] = struct{}{}
		}

		if yes {
			res = append(res, i)
		}

	}

	return res
}

func selfDividingNumbers(left, right int) (ans []int) {
	isSelfDividing := func(num int) bool {
		for x := num; x > 0; x /= 10 {
			if d := x % 10; d == 0 || num%d != 0 {
				return false
			}
		}
		return true
	}

	for i := left; i <= right; i++ {
		if isSelfDividing(i) {
			ans = append(ans, i)
		}
	}
	return
}

// 判断一个数是否自除数
func IsisSelfDividing(num int) bool {
	for i := num; i > 10; i /= 10 { // 退位
		d := i % 10 // 获取最后一位
		if d == 0 || num%d != 0 {
			return false
		}
	}
	return true
}
